package com.gton;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Mono;

/**
 * @description: 网关启动类
 * 可以与Spring Cloud Discovery Client（如Eureka）、Ribbon、Hystrix等组件配合使用，
 * 实现路由转发、负载均衡、熔断、鉴权、路径重写、志监控等
 * <p>
 * Gateway还内置了限流过滤器，实现了限流的功能。
 * <p>
 * 设计优雅，容易拓展
 * @author: GuoTong
 * @createTime: 2022-10-05 10:39
 * @since JDK 1.8 OR 11
 **/
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApp {
    /**
     * Description: Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目，
     * 目的是为了替换掉Zuul1，
     * 它基于Spring5.0 + SpringBoot2.0 + WebFlux（基于性能的Reactor模式响应式通信框架Netty，异步阻塞模型）等技术开发，
     * 性能于Zuul，官测试，Spring Cloud GateWay是Zuul的1.6倍 ，旨在为微服务架构提供种简单有效的统的API路由管理式。
     *
     * @author: GuoTong
     * @date: 2022-10-05 10:42:59
     */
    public static void main(String[] args) {
        try {
            SpringApplication.run(GateWayApp.class, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * IP限流
     * @return
     */
    @Bean(name = "ipKeyResolver")
    public KeyResolver userKeyResolver() {
        return exchange -> {
            //获取远程客户端IP
            String hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
            System.out.println("hostName:" + hostName);
            return Mono.just(hostName);
        };
    }
}
